package pe.com.certicom.moviles.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import pe.com.certicom.moviles.model.beans.Articulo;
import pe.com.certicom.moviles.model.beans.Asignacion;
import pe.com.certicom.moviles.model.beans.DetallePeriodoFacturacion;
import pe.com.certicom.moviles.model.beans.DetallePeriodoFacturacionExample;
import pe.com.certicom.moviles.model.beans.PeriodoFacturacion;
import pe.com.certicom.moviles.model.beans.PeriodoFacturacionExample;
import pe.com.certicom.moviles.model.beans.PeriodoFacturacionKey;
import pe.com.certicom.moviles.model.beans.ReporteConsolidado;
import pe.com.certicom.moviles.model.dao.ArticuloDAO;
import pe.com.certicom.moviles.model.dao.DetallePeriodoFacturacionDAO;
import pe.com.certicom.moviles.model.dao.PeriodoFacturacionDAO;

@Service
public class FacturacionServiceImpl implements FacturacionService{

	
	@Autowired
	private PeriodoFacturacionDAO periodoFacturacionDAO;
	
	@Autowired
	private ArticuloDAO articuloDAO;
	
	@Autowired
	private RecepcionService recepcionService;
	
	@Autowired
	private CatalogoService catalogoService;
	
	@Autowired
	private DetallePeriodoFacturacionDAO detallePeriodoFacturacionDAO;
	
	@Override
	public boolean existePeriodo(String codPeriodo,String codProveedor) {
		// TODO Auto-generated method stub
		PeriodoFacturacionKey key = new PeriodoFacturacionKey();
		key.setCodPeriodo(codPeriodo);
		key.setCodProveedor(codProveedor);
		PeriodoFacturacion periodoFacturacion = periodoFacturacionDAO.selectByPrimaryKey(key);
		return periodoFacturacion!=null;
	}

	
	@Override
	@Transactional(rollbackFor=Exception.class,readOnly=false)
	public void registrarPeriodo(PeriodoFacturacion periodoFacturacion) {
		// TODO Auto-generated method stub
		periodoFacturacionDAO.insertSelective(periodoFacturacion);
	}

	
	@Override
	@Transactional(rollbackFor=Exception.class,readOnly=false)
	public void modificarCerrarPeriodo(PeriodoFacturacion periodoFacturacion) {
		// TODO Auto-generated method stub
		
		String codEstado = periodoFacturacion.getCodEstado();
		if("C".equals(codEstado)){
			//Si estamos cerrando el estado entonces migramos todos los equipos hacia la tabla de detalle
			//1. Marco como cerrado todos los equipos
			this.articuloDAO.updateEquiposFacturables(periodoFacturacion);//Marco como cerrado a los equipos.
			List<Articulo> equipos = this.articuloDAO.listarEquiposFacturables(periodoFacturacion);
			
			//Para cada equipo cre un registro dentro de la tabla detalle_periodo_facturacion
			DetallePeriodoFacturacion detallePeriodo = null;
			
			DetallePeriodoFacturacion detallePeriodoSearch = new DetallePeriodoFacturacion();
			detallePeriodoSearch.setCodPeriodo(periodoFacturacion.getCodPeriodo());
			detallePeriodoSearch.setCodProveedor(periodoFacturacion.getCodProveedor());
			long contador = detallePeriodoFacturacionDAO.selectMaxDetalle(detallePeriodoSearch);
			
			for(Articulo equipo:equipos){
				Asignacion asignacion = recepcionService.getAsignacion(equipo.getIdUltimaAsignacion());
				detallePeriodo = new DetallePeriodoFacturacion();
				detallePeriodo.setCodPeriodo(periodoFacturacion.getCodPeriodo());
				detallePeriodo.setCodProveedor(periodoFacturacion.getCodProveedor());
				detallePeriodo.setCodArticulo(equipo.getCodArticulo());
				detallePeriodo.setCodCentroCosto(asignacion.getCodCentroCosto());
				detallePeriodo.setNumDetalle(++contador);
				detallePeriodo.setNumFactura(equipo.getNumFactura());
				detallePeriodo.setNumImei(equipo.getNumImei());
				detallePeriodo.setNumCelular(equipo.getNumCelular()!=null?equipo.getNumCelular():"-");
				detallePeriodo.setValMonto(equipo.getValCostoEquipo());
				
				detallePeriodo.setCodMoneda(equipo.getCodMoneda());
				//Registramos la marca, el modelo, la fecha y codigo de estado pero del momento en que se saca
				detallePeriodo.setCodEstado(equipo.getCodEstado());
				detallePeriodo.setFecEstado(equipo.getFecEstado());
				String marca = "-";
				if(equipo.getIdMarca()!=null)marca = catalogoService.getMarca(equipo.getIdMarca()).getDesMarca();	
				detallePeriodo.setDesMarca(marca);
				detallePeriodo.setDesModelo(equipo.getDesModelo());
				detallePeriodo.setDesUsuarioAsignado(asignacion.getDesApellidosUsuario()+" "+asignacion.getDesNombresUsuario());
				detallePeriodo.setFecFactura(equipo.getFecFactura());
				
				detallePeriodoFacturacionDAO.insertSelective(detallePeriodo);
			}
		}
		//Por ultimo actualizamos el periodo de facturacion.
		periodoFacturacionDAO.updateByPrimaryKeySelective(periodoFacturacion);
	}



	@Override
	public PeriodoFacturacion buscarPeriodo(String codPeriodo,
			String codProveedor) {
		// TODO Auto-generated method stub
		PeriodoFacturacionKey key = new PeriodoFacturacionKey();
		key.setCodPeriodo(codPeriodo);
		key.setCodProveedor(codProveedor);
		return periodoFacturacionDAO.selectByPrimaryKey(key);
	}

	@Override
	public boolean rangoValido(PeriodoFacturacion periodo) {
		int registros = periodoFacturacionDAO.cantidadRango(periodo);
		if(registros>0)return false;
		else return true;
	}


	@Override
	public List<ReporteConsolidado> generarReporteConsolidadoCentroCosto(
			HashMap<String, Object> parametros) {
		return periodoFacturacionDAO.reporteConsolidadoCentroCosto(parametros);
	}


	@Override
	public List<ReporteConsolidado> generarReporteConsolidadoProveedor(
			HashMap<String, Object> parametros) {
		return periodoFacturacionDAO.reporteConsolidadoProveedor(parametros);
	}

	
	
	@Override
	public List<PeriodoFacturacion> listarPeriodos(String codEstadoPeriodo, String codProveedor) {
		// TODO Auto-generated method stub
		HashMap<String,Object> parametros = new HashMap<String,Object>();
		parametros.put("codProveedor", !"ALL".equals(codProveedor.trim())?codProveedor:null);
		parametros.put("codEstadoPeriodo", "T".equals(codEstadoPeriodo)?null:codEstadoPeriodo);
		List<PeriodoFacturacion> periodos = new ArrayList<PeriodoFacturacion>();
		List<String> lista = periodoFacturacionDAO.listarPeriodos(parametros);
		for(String periodo:lista){
			PeriodoFacturacion p = new PeriodoFacturacion();
			p.setCodPeriodo(periodo);
			periodos.add(p);
		}
		return periodos;
	}


	@Override
	public List<ReporteConsolidado> generarReporteDetalladoCostos(
			HashMap<String, Object> parametros) {
		
		if(parametros.get("codPeriodo")!=null)return periodoFacturacionDAO.reporteDetalladoCostos(parametros);
		else return periodoFacturacionDAO.reporteDetalladoCostosFechas(parametros);
	}


	@Override
	public boolean existeConsumoPeriodo(String codPeriodo, String codProveedor,
			String numCelular) {
		DetallePeriodoFacturacionExample p1 = new DetallePeriodoFacturacionExample();
		DetallePeriodoFacturacionExample.Criteria criterios = p1.createCriteria();
		criterios.andCodPeriodoEqualTo(codPeriodo);
		criterios.andCodProveedorEqualTo(codProveedor);
		criterios.andCodArticuloEqualTo("C");
		criterios.andNumCelularEqualTo(numCelular);
		long contador = detallePeriodoFacturacionDAO.countByExample(p1);
		return contador>0;
	}

}






